package com.coderman.infosys.auth.domain.bo.role;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

import com.coderman.infosys.auth.domain.bo.BaseBOV2;
import com.coderman.infosys.auth.domain.support.bo.UserBO;

import com.coderman.infosys.plat.auth.common.bo.BaseBO;
import com.coderman.infosys.plat.auth.common.enums.StatusEnum;
import lombok.Data;
import lombok.ToString;

/**
* @Description:角色类
* @Author:shenshuai
* @CreateTime:2022-01-02 15:27:38
* @version v1.0
*/
@Data
@ToString
public class RoleBO extends BaseBOV2 {

   public RoleBO (){}
   public RoleBO(String roleCode){
      this.roleCode = roleCode;
   }

   /**
    * 根据实体标示构建RoleBO对象
    * @param roleCode
    * @return
    */
   public static RoleBO ofIdentifer(String roleCode){
      return new RoleBO(roleCode);
   }

   /** 主键ID **/
   private Long id;

   /** 角色名称 **/
   private String roleName;

   /** 角色编码 **/
   private String roleCode;

   /** 角色对应用户列表 **/
   private List<UserBO> userList;


   /** 角色用户关联关系 列表 **/
   private List<RoleUserBO> roleUserBOList;

   /** 角色状态 **/
   private Integer status;

   public void disable(){
      this.status = StatusEnum.DISABLE.getStatus();
   }

   public void enable(){
      this.status = StatusEnum.ENABLE.getStatus();
   }

   /**
    * 这里将用户角色关联的操作放在RoleBO上来体现是由RoleBO发起的关联而不是由服务类发起的关联，服务类只是触发这个调用
    * @param userIdList
    */
   public void relateToUser(List<Long> userIdList){
      if(this.userList == null || this.userList.isEmpty()){
         return;
      }
      this.userList = userIdList.stream().map(UserBO::new).collect(Collectors.toList());
   }


   /**
    * 这里将用户角色关联的操作放在RoleBO上来体现是由RoleBO发起的关联而不是由服务类发起的关联，服务类只是触发这个调用
    * 现在我们看一下第二个关联方法，直接构建RoleUserBO对象列表
    * 跟上面的方法有一点区别
    * @param userIdList
    */
   public void buildRoleUserRelation(List<Long> userIdList){
      if(this.userList == null || this.userList.isEmpty()){
         return ;
      }
      //将之前的清空，或者这里做并集处理
      userList.clear();
      this.roleUserBOList = userIdList.stream().map(userId->RoleUserBO.ofIdentifer(this.roleCode,userId)).collect(Collectors.toList());
   }


   /**
    * 判断是否存在关联关系
    * @return
    */
   public boolean containsRelation(){
      return this.userList != null && !this.userList.isEmpty();
   }

   /**
    * 判断该角色是否存在指定用户
    * @param userId
    * @return
    */
   public boolean containsUser(Long userId){
      if(!containsRelation()){
         return false;
      }
      return this.userList.contains(userId);
   }

}